// -------------------------------------------------------------------------
//    @FileName         :    NFCLoginNet_ServerModule.h
//    @Author           :    LvSheng.Huang
//    @Date             :    2013-01-02
//    @Module           :    NFCLoginNet_ServerModule
//    @Desc             :
// -------------------------------------------------------------------------

#ifndef NFC_LOGINNET_SERVER_MODULE_H
#define NFC_LOGINNET_SERVER_MODULE_H

#include "NFComm/NFCore/NFMap.hpp"
#include "NFComm/NFMessageDefine/NFMsgDefine.h"
#include "NFComm/NFPluginModule/NFIKernelModule.h"
#include "NFComm/NFPluginModule/NFILoginNet_ServerModule.h"
#include "NFComm/NFPluginModule/NFILoginLogicModule.h"
#include "NFComm/NFPluginModule/NFILogModule.h"
#include "NFComm/NFPluginModule/NFINetModule.h"
#include "NFComm/NFPluginModule/NFIElementModule.h"
#include "NFComm/NFPluginModule/NFIClassModule.h"
#include "NFComm/NFPluginModule/NFILoginToMasterModule.h"

#include "NFComm/NFPluginModule/NFIAccountDBModule.h"
#include "NFComm/NFPluginModule/NFINetServerModule.h"

#include "LoginDefine.h"

class NFCLoginNet_ServerModule
    : public NFILoginNet_ServerModule
{
public:
    NFCLoginNet_ServerModule(NFIPluginManager* p)
    {
        pPluginManager = p;
    }

    virtual bool Init();
    virtual bool Shut();
    virtual bool Execute();
    virtual bool Finalize();

    virtual bool BeforeShut();
    virtual bool AfterInit();

    virtual void LogReceive(const char* str) {}
    virtual void LogSend(const char* str) {}

    virtual int OnSelectWorldResultsProcess(const int nWorldID, const NFGUID xSenderID, const int nLoginID, const std::string& strAccount, const std::string& strWorldIP, const int nWorldPort, const std::string& strKey);

protected:
    void OnSocketClientEvent(const int nSockIndex, const NF_NET_EVENT eEvent, NFINet* pNet);

protected:
    void OnClientDisconnect(const int nAddress);
    void OnClientConnected(const int nAddress);

    void OnLoginProcess(const int nSockIndex, const int nMsgID, const char* msg, const uint32_t nLen);
    void OnSelectWorldProcess(const int nSockIndex, const int nMsgID, const char* msg, const uint32_t nLen);
    void OnViewWorldProcess(const int nSockIndex, const int nMsgID, const char* msg, const uint32_t nLen);

    void OnHeartBeat(const int nSockIndex, const int nMsgID, const char* msg, const uint32_t nLen);
    void OnLogOut(const int nSockIndex, const int nMsgID, const char* msg, const uint32_t nLen);
    void InvalidMessage(const int nSockIndex, const int nMsgID, const char* msg, const uint32_t nLen);
protected:
    void LoginProcessGetAccountInfoFromMysql(const NFGUID& self, const int nRet, const std::vector<std::string>& fieldVec, const std::vector<std::string>& valueVec, const std::string& strUseData);
protected:
    NF_SHARE_PTR<LoginRoleInfo> GetLoginRoleInfo(const NFGUID& clientId);
    void    LoginStateHandle();
protected:
    void SynWorldToClient(const int nFD);

    NFMapEx<NFGUID, LoginRoleInfo> mxClientIdent;

private:
    NFINetServerModule* m_pNetServerModule;
    NFINetModule* m_pNetModule;
    NFIClassModule* m_pClassModule;
    NFIElementModule* m_pElementModule;
    NFIKernelModule* m_pKernelModule;
    NFILogModule* m_pLogModule;
    NFILoginToMasterModule* m_pLoginToMasterModule;
    NFIAccountDBModule* m_pAccountRedisModule;
};

#endif
